Page({
  // 页面初始数据
  data: {
    latitude: 21.625465,  // 默认坐标
    longitude: 108.305471,
    markers: [],          // 地图标记点集合
    isLocated: false,     // 是否完成定位
    locating: false       // 新增：定位中状态
  },

  // 页面加载生命周期
  onLoad() {
    this.checkLocationAuth()  // 初始化时检查定位权限
  },

  // 检查用户定位权限（兼容多平台）
  async checkLocationAuth() {
    try {
      const { authSetting } = await wx.getSetting()  // 获取权限设置
      // 判断是否已授权定位权限
      if (!authSetting['scope.userLocation']) {
        await this.showAuthModal()  // 未授权则显示权限申请弹窗
      } else {
        await this.getCurrentLocation()  // 已授权直接获取定位
      }
    } catch (err) {
      this.handleLocationError(err)  // 统一错误处理
    }
  },

  // 显示权限申请模态框（增强用户体验）
  async showAuthModal() {
    const { confirm } = await wx.showModal({
      title: '需要位置权限',
      content: '请允许获取位置以查找附近球房',
      confirmColor: '#07c160'
    });
    if (confirm) {
      const { authSetting } = await wx.openSetting();
      if (authSetting['scope.userLocation']) {
        this.getCurrentLocation();
      } else {
        wx.showToast({ title: '未授权定位，使用默认位置', icon: 'none' });
        this.setData({ isLocated: false });
        this.loadVenues(this.data);
      }
    }
  },

  // 获取高精度地理位置（使用GCJ-02坐标系）
  async getCurrentLocation() {
    try {
      const res = await wx.getLocation({ 
        type: 'gcj02'  // 腾讯地图坐标系标准
      })
      // 更新地图中心点坐标
      this.setData({
        latitude: res.latitude,
        longitude: res.longitude,
        isLocated: true  // 标记定位成功
      })
      this.loadVenues(res)  // 加载周边球房数据
    } catch (err) {
      this.handleLocationError(err)
    }
  },

  // 加载周边球房数据（带超时重试机制）
  async loadVenues(location) {
    const { latitude, longitude } = location
    const API_KEY = 'UDNBZ-LWJCZ-HC3XK-7EQAZ-VF242-ERFIU'  // 腾讯位置服务密钥
    // 构造API请求URL（2000米范围搜索"台球"关键词）
    const url = `https://apis.map.qq.com/place/v1/search?keyword=台球&boundary=nearby(${latitude},${longitude},2000)&coord_type=3&key=${API_KEY}`
    
    try {
      const res = await wx.request({ 
        url,
        timeout: 8000,  // 8秒超时
        enableCache: true  // 启用请求缓存
      })
      
      // 校验API响应有效性
      if (res.statusCode === 200 && res.data?.status === 0) {
        this.processData(res.data)  // 处理有效数据
      } else {
        this.handleApiError(res.data || { status: res.statusCode })
      }
    } catch (err) {
      this.handleApiError({ status: -1, message: '网络请求失败' })
    }
  },

  // 标准化API响应数据结构
  processData(response) {
    const markers = response.data.map(item => ({
      id: item.id,  // 地点唯一ID
      title: item.title,  // 球房名称
      latitude: item.location.lat,  // 纬度
      longitude: item.location.lng,  // 经度
      address: item.address,  // 详细地址
      distance: (item._distance / 1000).toFixed(1) + '公里',  // 距离格式化
      iconPath: '/assets/marker.png',  // 自定义标记图标
      width: 32,  // 标记宽度
      height: 32,  // 标记高度
      callout: {  // 标记弹窗配置
        content: `${item.title}\n距离：${(item._distance/1000).toFixed(1)}公里`,  // 显示内容
        color: '#333',  // 文字颜色
        bgColor: '#fff',  // 背景色
        padding: 8  // 内边距
      }
    }))
    
    this.setData({ markers })  // 更新地图标记
  },

  // 定位失败处理（降级方案）
  handleLocationError(err) {
    wx.showToast({ 
      title: '定位失败，使用默认位置', 
      icon: 'none',  // 不显示图标
      duration: 2000
    })
    this.setData({ isLocated: false })
    this.loadVenues(this.data)  // 使用默认坐标加载数据
  },

  // API错误分类处理
  handleApiError(response) {
    const errorMap = {
      110: '密钥未绑定小程序AppID',  // 常见错误码
      121: '每日限额已用完（500次）',
      190: '密钥无效',
      '-1': '网络连接超时'
    }
    wx.showModal({
      title: '加载失败',
      content: errorMap[response.status] || '服务异常，请重试',  // 友好错误提示
      confirmText: '重新加载',
      success: ({ confirm }) => confirm && this.loadVenues(this.data)  // 重试机制
    })
  },

  // 调用系统地图导航
  navigateToVenue(e) {
    const markerId = e.detail.markerId  // 获取点击的标记ID
    const target = this.data.markers.find(m => m.id === markerId)  // 查找目标球房
    wx.openLocation({  // 调起地图APP
      latitude: target.latitude,
      longitude: target.longitude,
      name: target.title,  // 目的地名称
      address: target.address  // 详细地址
    })
  }
})